<?php
/**
 * @author		João Batista Neto
 * @package		rpo
 * @subpackage	ssh\state
 * @category	ssh, state
 */
namespace rpo\ssh\state;

use rpo\base\exception\RuntimeException;
use rpo\ssh\interfaces\AbstractSSHState;
use rpo\ssh\interfaces\ISSHConnection;

/**
 * Implementa o estado para uma conexão fechada
 * @author		João Batista Neto
 * @final
 * @package		rpo
 * @subpackage	ssh\state
 * @category	ssh, state
 */
final class SSHStateClosed extends AbstractSSHState {
	/**
	 * @staticvar
	 * @var ISSHConnection
	 */
	static private $context;

	/**
	 * Abre uma nova conexão
	 * @param String $host
	 * @param integer $port
	 * @param ISSHConnection $context
	 * @return boolean
	 * @throws RuntimeException se não for possível estabelecer a conexão
	 * @uses SSHStateEstabilished
	 */
	public function open( String $host , $port = 22 , ISSHConnection $context ){
		$resource = ssh2_connect( $host , $port , array(
			'disconnect'	=> array( 'SSHStateClosed' , 'disconnect' )
		) );

		if ( !is_resource( $resource ) ){
			throw new RuntimeException( 'Não foi possível estabelecer a conexão.' );
		} else {
			$estabilished = new SSHStateEstabilished();
			$estabilished->setResource( $resource );

			self::$context =& $context;
			self::$context->changeState( $estabilished );
		}

		return true;
	}

	/**
	 * Muda o estado da conexão para SSHStateClosed caso o servidor envie um disconnect
	 * @static
	 */
	static public function disconnect(){
		self::$context->changeState( new SSHStateClosed() );
	}
}